package com.product;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.util.MQConnectionUtils;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 *1、Direct（直连模式）交换机生产者
 * 2、将消息发送到所有绑定到它身上的消费者（队列）
 * 3、路由模式（必须先启动消费者，再启动生产者，这样发送的消息才能被消费者接收到，否则消息可能会被丢失，因为交换机不会缓存消息）
 * 4、交换机只做转发，不做缓存
 * 5、路由模式，即使交换机相同，消费者也不一定能收到消息，还需要通过routingKey（路由键），来判断到底发给哪个消费者，只有routingKey和生产者的routingKey相同的消费者，才能消费消息
 */
public class ProducerDirect {
    private static final String EXCHANGE_NAME = "direct_exchange";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.创建新的连接
        Connection connection = MQConnectionUtils.newConnection();
        // 2.创建通道
        Channel channel = connection.createChannel();
        // 3.绑定的交换机 参数1交互机名称 参数2 exchange类型
        channel.exchangeDeclare(EXCHANGE_NAME, "direct");
        String routingKey = "info";
        String msg = "direct_exchange_msg" + routingKey;
        // 4.发送消息
        channel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes());
        System.out.println("生产者发送msg：" + msg);
        // // 5.关闭通道、连接
        channel.close();
        connection.close();
        // 注意：如果消费没有绑定交换机和队列，则消息会丢失

    }

}
